#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

int main()
{
    int fd[2];
    if (pipe(fd) < 0)
    {
        perror("pipe!");
        return 1;
    }
    pid_t id = fork();
    if (id == 0)
    {
        // child
        close(fd[0]);
        const char *mag = "hello linux\n";
        write(fd[1], mag, strlen(mag));
        exit(0);
    }
    // father
    // 关闭读端和写端
    close(fd[1]);
    close(fd[0]);
    int status = 0;
    waitpid(id, &status, 0);
    // 打印信号
    printf("child get signal:%d\n", status & 0x7F);
    return 0;
}

// int main()
// {
//     int fd[2];
//     // 创建匿名管道
//     if (pipe(fd) < 0)
//     {
//         perror("pipe!");
//         return 1;
//     }
//     // 创建子进程
//     int id = fork();
//     if (id == 0)
//     {
//         // child
//         close(fd[0]);
//         const char *mag = "hello linux\n";
//         int count = 5;
//         while (count)
//         {
//             write(fd[1], mag, strlen(mag));
//             count--;
//             sleep(1);
//         }
//         exit(0);
//     }
//     // father
//     close(fd[1]);
//     char buff[64];
//     while (1)
//     {
//         ssize_t s = read(fd[0], buff, sizeof(buff));
//         if (s > 0)
//         {
//             buff[s] = '\0';
//             printf("child --->father#%s", buff);
//             sleep(1);
//         }
//         else if (s == 0)
//         {
//             printf("read end\n");
//             break;
//         }
//         else
//         {
//             printf("error\n");
//             break;
//         }
//     }
//     // 等待子进程结束，回收资源，防止僵尸进程。
//     waitpid(id, NULL, 0);
//     close(fd[0]);
//     return 0;
// }